package com.jacob.androidframe.util;

import java.io.File;
import java.text.SimpleDateFormat;
import java.util.Date;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.jacob.androidframe.controls.ApplicationExtend;

import android.app.Activity;
import android.content.ActivityNotFoundException;
import android.content.Context;
import android.content.Intent;
import android.net.Uri;
import android.provider.MediaStore;
import android.text.TextUtils;
import android.text.format.DateFormat;
import android.util.Log;

public class UtilIntent
{
	/**
	 * 调用短信程序发送短信，不需要申请权限。
	 * 如果发生任何异常，则会输出日志并返回。
	 * 
	 * @param pContext
	 *            用于启动Activity。若传入null，会尝试使用程序的ApplicationContext对象启动Activity。
	 * @param pPhoneNum
	 *            目标电话号码
	 * @param pText
	 *            短信内容
	 */
	public static void startSendSMSActivity(Context pContext, String pPhoneNum, String pText)
	{
		Intent _Intent = new Intent(Intent.ACTION_SENDTO);
		_Intent.setData(Uri.fromParts("smsto", pPhoneNum, null));
		_Intent.putExtra("sms_body", pText);

		try {
			if (pContext != null) {
				pContext.startActivity(_Intent);
			} else {
				Log.e("UtilIntent.startSendSMS()", "Context is null.");
				ApplicationExtend.getInstance().startActivity(_Intent);
			}
		} catch (ActivityNotFoundException e) {
			Log.e("UtilIntent.startSendSMS()", "SMS Activity Not Found.", e);
		} catch (Exception e) {
			Log.e("UtilIntent.startSendSMS()", "Occur Exception.", e);
		}
	}

	/**
	 * 传入电话号码，调用系统的拨号程序。不需要申请权限。
	 * 如果发生任何异常，则会输出日志并返回。
	 * 
	 * @param pContext
	 *            用于启动Activity。若传入null，会尝试使用程序的ApplicationContext对象启动Activity。
	 * @param pPhoneNum
	 *            目标电话号码。若传入null或空字符串，则会输出日志并返回。
	 */
	public static void startDialActivity(Context pContext, String pPhoneNum)
	{
		if (TextUtils.isEmpty(pPhoneNum)) {
			Log.e("UtilIntent.callPhoneNum()", "PhoneNum is empty.");
			return;
		}
		
		Uri _Uri = Uri.parse("tel:" + pPhoneNum);
		Intent _Intent = new Intent(Intent.ACTION_DIAL, _Uri);
		
		try {
			if (pContext != null) {
				pContext.startActivity(_Intent);
			} else {
				Log.e("UtilIntent.callPhoneNum()", "Context is null.");
				ApplicationExtend.getInstance().startActivity(_Intent);
			}
		} catch (ActivityNotFoundException e) {
			Log.e("UtilIntent.callPhoneNum()", "Dial Activity Not Found.", e);
		} catch (Exception e) {
			Log.e("UtilIntent.callPhoneNum()", "Occur Exception.", e);
		}
	}
	
	/**
	 * 传入电话号码，调用系统的拨号程序直接拨号。需要“android.permission.CALL_PHONE”权限。
	 * 如果发生任何异常，则会输出日志并返回。
	 * 
	 * @param pContext
	 *            用于启动Activity。若传入null，会尝试使用程序的ApplicationContext对象启动Activity。
	 * @param pPhoneNum
	 *            目标电话号码。若传入null或空字符串，则会输出日志并返回。
	 */
	public static void startCallActivity(Context pContext, String pPhoneNum)
	{
		if (TextUtils.isEmpty(pPhoneNum)) {
			Log.e("UtilIntent.callPhoneNum()", "PhoneNum is empty.");
			return;
		}

		Uri _Uri = Uri.parse("tel:" + pPhoneNum);
		Intent _Intent = new Intent(Intent.ACTION_CALL, _Uri);

		try {
			if (pContext != null) {
				pContext.startActivity(_Intent);
			} else {
				Log.e("UtilIntent.callPhoneNum()", "Context is null.");
				ApplicationExtend.getInstance().startActivity(_Intent);
			}
		} catch (ActivityNotFoundException e) {
			Log.e("UtilIntent.callPhoneNum()", "Dial Activity Not Found.", e);
		} catch (Exception e) {
			Log.e("UtilIntent.callPhoneNum()", "Occur Exception.", e);
		}
	}
	
	/**
	 * 启动相机拍照，然后返回照片。照片会保存到设备的存储器中。调用者需要自己到指定路径里寻找照片进行下一步处理。
	 * 
	 * @param pActivity 用于启动相机Activity。因为拍照后要返回照片进一步处理，所以这里不能传入null。
	 * @param pRequestCode 用于启动相机Activity。
	 * @param pDir 照片保存的路径。若传入null，或者传入的对象不是目录，则会将照片保存在UtilFile.getCacheDir()中。
	 * @param pFileName 照片的文件名。若传入null，若长度为0的String对象，则会使用当前时间作为文件名。
	 * 
	 */
	public static void startPhotoActivity(Activity pActivity, int pRequestCode, File pDir, String pFileName)
	{
		if (pActivity == null) {
			throw new IllegalArgumentException("Activity is null.");
		}
		
		if (pDir == null || !pDir.isDirectory()) {
			pDir = UtilFile.getCacheDir();
		}
		
		if (!pDir.exists()) {
			pDir.mkdirs();
		}
		
		if (TextUtils.isEmpty(pFileName)) {
			pFileName = new SimpleDateFormat("yyyy-MM-dd_HH-mm-ss-SSS").format(new Date());
		}
		
		Uri _PhotoUri = Uri.fromFile(new File(pDir, pFileName));
		
		Intent _Intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
		_Intent.putExtra(MediaStore.EXTRA_OUTPUT, _PhotoUri);
		
		try {
			pActivity.startActivityForResult(_Intent, pRequestCode);
		} catch (ActivityNotFoundException e) {
			Log.e("UtilIntent.startPhotoActivity()", "Photo Not Found.", e);
		} catch (Exception e) {
			Log.e("UtilIntent.startPhotoActivity()", "Occur Exception.", e);
		}
	}
	
	/**
	 * 启动相机拍照，然后返回照片。照片不会保存到设备的存储器中，而是保存在Intent中返回给调用者。
	 * 调用者需要在onActivityResult()方法中得到照片进行下一步处理。
	 * <p>
	 * 例如：
	 * <p>
	 * if (resultCode == RESULT_OK)<p>
	 * {<p>
	 *     Bitmap bmp = (Bitmap)data.getExtras().get("data");<p>
	 * }<p>
	 * <p>
	 * 
	 * @param pActivity 用于启动相机Activity。因为拍照后要返回照片进一步处理，所以这里不能传入null。
	 * @param pRequestCode 用于启动相机Activity。
	 * 
	 */
	public static void startPhotoActivity(Activity pActivity, int pRequestCode)
	{
		if (pActivity == null) {
			throw new IllegalArgumentException("Activity is null.");
		}
		
		Intent _Intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
		
		try {
			pActivity.startActivityForResult(_Intent, pRequestCode);
		} catch (ActivityNotFoundException e) {
			Log.e("UtilIntent.startPhotoActivity()", "Photo Not Found.", e);
		} catch (Exception e) {
			Log.e("UtilIntent.startPhotoActivity()", "Occur Exception.", e);
		}
	}
	
}
